package com.flyqiu.common.tools;

import java.util.Collection;
import java.util.Iterator;
import java.util.Objects;
import java.util.function.Consumer;

/**
 * 提供了一些条件判断工具方法。
 */
public class ConditionTools {

    /**
     * 比较两个字符串是否相等。
     *
     * @param source 第一个字符串
     * @param target 第二个字符串
     * @return 如果两个字符串相等（考虑null情况），返回true；否则返回false。
     */
    public static boolean eq(String source, String target) {
        if (source == null && target == null) return true;
        if (source != null && target == null) return false;
        if (source == null) return false;
        return source.equals(target);
    }

    /**
     * 比较多个字符串对是否相等。
     *
     * @param data 字符串对数组，每个偶数索引和其下一个奇数索引的元素构成一对。
     * @return 如果所有字符串对都相等，返回true；否则返回false。
     * @throws RuntimeException 如果数据为空或长度不符合要求，抛出运行时异常。
     */
    public static boolean eq(String... data) {
        if (data == null) {
            throw new RuntimeException("data Cannot be null or empty");
        }
        if (data.length < 2) {
            throw new RuntimeException("The data length must be greater than 2");
        }
        if (data.length == 2) {
            return eq(data[0], data[1]);
        }
        if (data.length % 2 == 0) {
            int len = data.length / 2;
            for (int i = 0; i < len; i++) {
                if (!eq(data[i * 2], data[i * 2 + 1])) {
                    return false;
                }
            }
            return true;
        }
        int len = data.length;
        for (int i = 1; i < len; i++) {
            if (!eq(data[i - 1], data[i])) {
                return false;
            }
        }
        return true;
    }

    /**
     * 比较集合中的所有元素是否相等。
     *
     * @param booleans 布尔值集合，不能包含null。
     * @return 如果所有元素都相等，返回true；否则返回false。
     * @throws RuntimeException 如果集合包含null或长度不符合要求，抛出运行时异常。
     */
    public static boolean eq(Collection<Boolean> booleans) {
        long count = booleans.stream().filter(Objects::isNull).count();
        if (count > 0) {
            throw new RuntimeException("The collection contains null");
        }
        Iterator<Boolean> iterator = booleans.iterator();
        if (booleans.size() < 2) {
            return iterator.next();
        }
        if (booleans.size() % 2 == 0) {
            while (iterator.hasNext()) {
                if (iterator.next() != iterator.next()) {
                    return false;
                }
            }
            return true;
        }
        Boolean next = iterator.next();
        while (iterator.hasNext()) {
            Boolean temp = iterator.next();
            if (next != temp) {
                return false;
            }
        }
        return true;
    }

    /**
     * 根据条件执行消费者操作。
     *
     * @param execute 条件 flag，如果为true，则执行操作。
     * @param obj 操作的对象。
     * @param consumer 对象的消费者。
     * @param <T> 操作对象的类型。
     */
    public static <T> void execute(boolean execute, T obj, Consumer<T> consumer) {
        if (!execute) {
            return;
        }
        consumer.accept(obj);
    }
}